#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <chrono>
#include <sw/redis++/redis++.h>
#include "../util.hpp"
using namespace std::chrono_literals;	// 字面量
using sw::redis::Redis;

void test1(Redis& redis){
    // 清空数据库
    redis.flushall();
 
    // 设置单个字段-值对
    redis.hset("key", "f1", "111");
    // 使用 std::pair 设置另一个字段-值对
    redis.hset("key", std::make_pair("f2", "222"));
 
    // 批量设置多个字段-值对
    redis.hset("key", {std::make_pair("f3", "333"), std::make_pair("f4", "444")});
 
    // 使用容器批量设置
    std::vector<std::pair<std::string, std::string>> fields = {
        std::make_pair("f5", "555"),
        std::make_pair("f6", "666")
    };
    redis.hset("key", fields.begin(), fields.end());
 
    // 获取并打印字段 f3 的值
    auto result = redis.hget("key", "f3");
    if (result) {
        std::cout << "result: " << result.value() << std::endl;
    } else {
        std::cout << "result 无效!" << std::endl;
    }
}

void test2(Redis& redis){
    // 清空数据库
    redis.flushall();
    redis.hset("key", {std::make_pair("f1", "111"), std::make_pair("f2", "222"), std::make_pair("f3", "333")});
    
    std::cout << "key 的字段数量: " << redis.hlen("key") << std::endl;
    std::cout << "f1 是否存在: " << redis.hexists("key", "f1") << std::endl;
    redis.hdel("key", "f2");
    std::cout << "删除f2后, f2 是否存在: " << redis.hexists("key", "f2") << std::endl;
}

void test3(Redis& redis){
    // 清空数据库
    redis.flushall();
    redis.hset("key", {std::make_pair("f1", "111"), std::make_pair("f2", "222"), std::make_pair("f3", "333")});

    std::vector<std::string> fields;
    redis.hkeys("key", std::back_inserter(fields));
    printContainer(fields);

    // 获取所有字段的值
    std::vector<std::string> values;
    redis.hvals("key", std::back_inserter(values));
    printContainer(values);
}

void test4(Redis& redis){
    // 清空数据库
    redis.flushall();
    redis.hset("key", {std::make_pair("f1", "111"), std::make_pair("f2", "222"), std::make_pair("f3", "333")});

    // 再次批量设置更多字段-值对
    std::vector<std::pair<std::string, std::string>> pairs = {
        std::make_pair("f4", "444"),
        std::make_pair("f5", "555"),
        std::make_pair("f6", "666")
    };
    redis.hmset("key", pairs.begin(), pairs.end());
 
    // 获取并打印指定字段的值
    std::vector<std::string> values;
    auto it = std::back_inserter(values);
    redis.hmget("key", {"f1", "f2", "f3"}, it);
    printContainer(values);
}

int main(){
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // 如果 Redis 设置了密码，请在这里添加认证
    redis.auth("123456");  // 替换 Redis 密码
    // 测试函数
    test4(redis);

    return 0;
}